import express from 'express'
import cors from 'cors'
import { connectDB, closeDB } from './config/database.js'
import {
  createUser,
  findUserByUsername,
  findUserByEmail,
} from './models/User.js'
import {
  createH5User,
  findH5UserByUsername,
  findH5UserByEmail,
} from './models/H5User.js'
import { generateToken, hashPassword, comparePassword } from './utils/auth.js'

const host = process.env.HOST ?? 'localhost'
const port = process.env.PORT ? Number(process.env.PORT) : 3000

const app = express()

// 中间件
app.use(cors()) // 允许跨域（前端开发需要）
app.use(express.json())

// ==================== 根路由 ====================
app.get('/', (req, res) => {
  res.json({
    message: 'Financial Platform API',
    version: '1.0.0',
    endpoints: {
      auth: {
        register: 'POST /auth/register',
        login: 'POST /auth/login',
      },
    },
  })
})

// ==================== 认证路由 ====================

/**
 * 用户注册
 */
app.post('/auth/register', async (req, res): Promise<void> => {
  try {
    const { username, email, password, role = 'viewer' } = req.body

    // 验证必填字段
    if (!username || !email || !password) {
      res.status(400).json({
        code: -1,
        message: '用户名、邮箱和密码为必填项',
      })
      return
    }

    // 检查用户名是否已存在
    const existingUser = await findUserByUsername(username)
    if (existingUser) {
      res.status(400).json({
        code: -1,
        message: '用户名已存在',
      })
      return
    }

    // 检查邮箱是否已存在
    const existingEmail = await findUserByEmail(email)
    if (existingEmail) {
      res.status(400).json({
        code: -1,
        message: '邮箱已被注册',
      })
      return
    }

    // 加密密码
    const hashedPassword = await hashPassword(password)

    // 创建用户
    const user = await createUser({
      username,
      email,
      password: hashedPassword,
      role,
    })

    // 生成 token
    const token = generateToken({
      userId: user._id!.toString(),
      username: user.username,
      role: user.role,
    })

    res.json({
      code: 0,
      message: '注册成功',
      data: {
        token,
        user: {
          id: user._id,
          username: user.username,
          email: user.email,
          role: user.role,
        },
      },
    })
  } catch (error) {
    console.error('注册失败:', error)
    res.status(500).json({
      code: -1,
      message: error instanceof Error ? error.message : '服务器错误',
    })
  }
})

/**
 * 用户登录
 */
app.post('/auth/login', async (req, res): Promise<void> => {
  try {
    const { username, password } = req.body

    // 验证必填字段
    if (!username || !password) {
      res.status(400).json({
        code: -1,
        message: '用户名和密码为必填项',
      })
      return
    }

    // 查找用户
    const user = await findUserByUsername(username)
    if (!user) {
      res.status(401).json({
        code: -1,
        message: '用户名或密码错误',
      })
      return
    }

    // 验证密码
    const isPasswordValid = await comparePassword(password, user.password)
    if (!isPasswordValid) {
      res.status(401).json({
        code: -1,
        message: '用户名或密码错误',
      })
      return
    }

    // 生成 token
    const token = generateToken({
      userId: user._id!.toString(),
      username: user.username,
      role: user.role,
    })

    res.json({
      code: 0,
      message: '登录成功',
      data: {
        token,
        user: {
          id: user._id,
          username: user.username,
          email: user.email,
          role: user.role,
        },
      },
    })
  } catch (error) {
    console.error('登录失败:', error)
    res.status(500).json({
      code: -1,
      message: error instanceof Error ? error.message : '服务器错误',
    })
  }
})

// ==================== H5端认证路由 ====================

/**
 * H5用户登录（普通用户）
 */
app.post('/auth/h5/login', async (req, res): Promise<void> => {
  try {
    const { username, password } = req.body

    // 验证必填字段
    if (!username || !password) {
      res.status(400).json({
        code: -1,
        message: '用户名和密码为必填项',
      })
      return
    }

    // 查找H5用户
    const user = await findH5UserByUsername(username)
    if (!user) {
      res.status(401).json({
        code: -1,
        message: '用户名或密码错误',
      })
      return
    }

    // 验证密码
    const isPasswordValid = await comparePassword(password, user.password)
    if (!isPasswordValid) {
      res.status(401).json({
        code: -1,
        message: '用户名或密码错误',
      })
      return
    }

    // 生成 token（H5用户没有role字段，使用默认值'user'）
    const token = generateToken({
      userId: user._id!.toString(),
      username: user.username,
      role: 'user', // H5普通用户
    })

    res.json({
      code: 0,
      message: '登录成功',
      data: {
        token,
        user: {
          id: user._id,
          username: user.username,
          email: user.email || '',
          role: 'user',
        },
      },
    })
  } catch (error) {
    console.error('H5登录失败:', error)
    res.status(500).json({
      code: -1,
      message: error instanceof Error ? error.message : '服务器错误',
    })
  }
})

/**
 * H5用户注册（普通用户）
 */
app.post('/auth/h5/register', async (req, res): Promise<void> => {
  try {
    const { username, email, password, phone } = req.body

    // 验证必填字段
    if (!username || !password) {
      res.status(400).json({
        code: -1,
        message: '用户名和密码为必填项',
      })
      return
    }

    // 检查用户名是否已存在
    const existingUser = await findH5UserByUsername(username)
    if (existingUser) {
      res.status(400).json({
        code: -1,
        message: '用户名已存在',
      })
      return
    }

    // 检查邮箱是否已存在
    if (email) {
      const existingEmail = await findH5UserByEmail(email)
      if (existingEmail) {
        res.status(400).json({
          code: -1,
          message: '邮箱已被注册',
        })
        return
      }
    }

    // 加密密码
    const hashedPassword = await hashPassword(password)

    // 创建H5用户
    const user = await createH5User({
      username,
      email,
      password: hashedPassword,
      phone,
    })

    // 生成 token
    const token = generateToken({
      userId: user._id!.toString(),
      username: user.username,
      role: 'user',
    })

    res.json({
      code: 0,
      message: '注册成功',
      data: {
        token,
        user: {
          id: user._id,
          username: user.username,
          email: user.email || '',
          role: 'user',
        },
      },
    })
  } catch (error) {
    console.error('H5注册失败:', error)
    res.status(500).json({
      code: -1,
      message: error instanceof Error ? error.message : '服务器错误',
    })
  }
})

// ==================== 启动服务器 ====================
async function startServer() {
  try {
    // 连接数据库
    await connectDB()

    // 启动 Express 服务器
    app.listen(port, host, () => {
      console.log(`🚀 服务器运行中: http://${host}:${port}`)
      console.log(`📂 数据库: ${process.env.DB_NAME || 'financial-platform'}`)
      console.log(`📝 查看 API 文档: http://${host}:${port}`)
    })
  } catch (error) {
    console.error('❌ 服务器启动失败:', error)
    process.exit(1)
  }
}

// 优雅关闭
process.on('SIGINT', async () => {
  console.log('\n⏳ 正在关闭服务器...')
  await closeDB()
  process.exit(0)
})

// 启动
startServer()
